์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ๋ ฅํ ์ Iterator.prototype.every ๋ฉ์๋๋ฅผ ํ์ํ์ธ์. ์ด ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ ํฌํผ๊ฐ ์คํธ๋ฆผ, ์ ๋๋ ์ดํฐ, ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ ๋ฒ์ฉ ์กฐ๊ฑด ๊ฒ์ฌ๋ฅผ ์ด๋ป๊ฒ ๋จ์ํํ๋์ง ์ค์ ์์ ์ ์ฑ๋ฅ ํต์ฐฐ๋ ฅ์ผ๋ก ์์๋ด ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ์๋ก์ด ์ํผํ์: ๋ฒ์ฉ ์คํธ๋ฆผ ์กฐ๊ฑด์ ์ํ 'every' ์ดํฐ๋ ์ดํฐ ํฌํผ
ํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์งํํ๋ ํ๊ฒฝ ์์์ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃจ๋ ๋ฐ์ดํฐ์ ๊ท๋ชจ๋ ๋์์์ด ์ฆ๊ฐํ๊ณ ์์ต๋๋ค. ์น์์ผ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ์ค์๊ฐ ๋ถ์ ๋์๋ณด๋๋ถํฐ ๋ฐฉ๋ํ ๋ก๊ทธ ํ์ผ์ ํ์ฑํ๋ ์๋ฒ์ฌ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฅด๊ธฐ๊น์ง, ๋ฐ์ดํฐ ์ํ์ค๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฅ๋ ฅ์ ๊ทธ ์ด๋ ๋๋ณด๋ค ์ค์ํด์ก์ต๋๋ค. ์๋ ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์๋ค์ ์ปฌ๋ ์ ์ ์กฐ์ํ๊ธฐ ์ํด `Array.prototype`์์ ์ ๊ณตํ๋ ํ๋ถํ๊ณ ์ ์ธ์ ์ธ ๋ฉ์๋๋คโ`map`, `filter`, `reduce`, `every`โ์ ํฌ๊ฒ ์์กดํด์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ํธ๋ฆฌํจ์๋ ์ค๋ํ ๊ฒฝ๊ณ ๊ฐ ๋ฐ๋์ต๋๋ค: ๋ฐ์ดํฐ๊ฐ ๋ฐฐ์ด์ด์ด์ผ ํ๊ฑฐ๋, ๋ฐฐ์ด๋ก ๋ณํํ๋ ๋น์ฉ์ ๊ธฐ๊บผ์ด ์ง๋ถํด์ผ ํ๋ค๋ ๊ฒ์ด์์ฃ .
์ด ๋ณํ ๋จ๊ณ๋ ์ข ์ข `Array.from()`์ด๋ ์ ๊ฐ ๊ตฌ๋ฌธ(`[...]`)์ผ๋ก ์ํ๋๋ฉฐ, ๊ทผ๋ณธ์ ์ธ ๊ธด์ฅ๊ฐ์ ์ ๋ฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ํนํ ํฌ๊ฑฐ๋ ๋ฌดํํ ๋ฐ์ดํฐ์ ์ ๋ค๋ฃฐ ๋ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ๊ณผ ์ง์ฐ ํ๊ฐ(lazy evaluation)์ ์ด์ ๋๋ฌธ์ ์ดํฐ๋ ์ดํฐ์ ์ ๋๋ ์ดํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํธ๋ฆฌํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ด ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ฐฐ์ด๋ก ๊ฐ์ ๋ก ๋ณํํ๋ ๊ฒ์ ์ด๋ฌํ ํต์ฌ ์ด์ ์ ๋ฌดํจํํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์๊ณผ ์ ์ฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํ๋ก์ฐ ์ค๋ฅ๋ฅผ ์ด๋ํฉ๋๋ค. ์ด๋ ๋ง์น ๋ฅ๊ทผ ๊ตฌ๋ฉ์ ๋ค๋ชจ๋ ๋ชป์ ๋ฐ์ผ๋ ค๋ ์ ํ์ ์ธ ์ฌ๋ก์ ๊ฐ์ต๋๋ค.
๋ฐ๋ก ์ด๋ ์ดํฐ๋ ์ดํฐ ํฌํผ(Iterator Helpers) ์ ์์ด ๋ฑ์ฅํ์ต๋๋ค. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ชจ๋ ์ดํฐ๋ฌ๋ธ(iterable) ๋ฐ์ดํฐ์ ์ํธ์์ฉํ๋ ๋ฐฉ์์ ์ฌ์ ์ํ ํ์ ์ ์ธ TC39 ์ด๋์ ํฐ๋ธ์ ๋๋ค. ์ด ์ ์์ `Iterator.prototype`์ ๊ฐ๋ ฅํ๊ณ ์ฐ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋ ๋ชจ์์ผ๋ก ๋ณด๊ฐํ์ฌ, ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋ ์์ด ๋ฐฐ์ด ๋ฉ์๋์ ํํ๋ ฅ์ ๋ชจ๋ ์ดํฐ๋ฌ๋ธ ์์ค์ ์ง์ ์ ๊ณตํฉ๋๋ค. ์ค๋, ์ฐ๋ฆฌ๋ ์ด ์๋ก์ด ๋๊ตฌ ํคํธ์์ ๊ฐ์ฅ ์ํฅ๋ ฅ ์๋ ํฐ๋ฏธ๋ ๋ฉ์๋ ์ค ํ๋์ธ `Iterator.prototype.every`๋ฅผ ์ฌ์ธต์ ์ผ๋ก ์ดํด๋ณผ ๊ฒ์ ๋๋ค. ์ด ๋ฉ์๋๋ ๋ฒ์ฉ ๊ฒ์ฆ๊ธฐ๋ก, ์ด๋ค ์ดํฐ๋ฌ๋ธ ์ํ์ค์ ๋ชจ๋ ๋จ์ผ ์์๊ฐ ์ฃผ์ด์ง ๊ท์น์ ์ค์ํ๋์ง ํ์ธํ๋ ๊น๋ํ๊ณ , ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ ๋ คํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋์์๋ `every`์ ๋ฉ์ปค๋์ฆ, ์ค์ ์ ์ฉ ์ฌ๋ก, ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ํ๊ตฌํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๋จํ ์ปฌ๋ ์ , ๋ณต์กํ ์ ๋๋ ์ดํฐ, ์ฌ์ง์ด ๋ฌดํ ์คํธ๋ฆผ๊ณผ ํจ๊ป ๊ทธ ๋์์ ๋ถ์ํ์ฌ, ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๋ ์์ ํ๊ณ , ๋ ํจ์จ์ ์ด๋ฉฐ, ๋ ํํ๋ ฅ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ ์๋ก์ด ํจ๋ฌ๋ค์์ ์ด๋ป๊ฒ ๊ฐ๋ฅํ๊ฒ ํ๋์ง ๋ณด์ฌ์ค ๊ฒ์ ๋๋ค.
ํจ๋ฌ๋ค์์ ์ ํ: ์ ์ดํฐ๋ ์ดํฐ ํฌํผ๊ฐ ํ์ํ๊ฐ
Iterator.prototype.every์ ๊ฐ์น๋ฅผ ์จ์ ํ ์ดํดํ๋ ค๋ฉด, ๋จผ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ดํฐ๋ ์ด์ (iteration)์ ๋ํ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์ดํฐ๋ ์ดํฐ ํฌํผ๊ฐ ํด๊ฒฐํ๊ณ ์ ํ๋ ํน์ ๋ฌธ์ ๋ค์ ์ดํดํด์ผ ํฉ๋๋ค.
์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ: ๊ฐ๋จํ ๋ณต์ต
ํต์ฌ์ ์ผ๋ก, ์๋ฐ์คํฌ๋ฆฝํธ์ ์ดํฐ๋ ์ด์ ๋ชจ๋ธ์ ๊ฐ๋จํ ๊ณ์ฝ์ ๊ธฐ๋ฐํฉ๋๋ค. ์ดํฐ๋ฌ๋ธ(iterable)์ ์ด๋ป๊ฒ ์ํ๋ ์ ์๋์ง๋ฅผ ์ ์ํ๋ ๊ฐ์ฒด์ ๋๋ค(์: `Array`, `String`, `Map`, `Set`). ์ด๋ `[Symbol.iterator]` ๋ฉ์๋๋ฅผ ๊ตฌํํจ์ผ๋ก์จ ์ด๋ฃจ์ด์ง๋๋ค. ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด, ์ดํฐ๋ ์ดํฐ(iterator)๋ฅผ ๋ฐํํฉ๋๋ค. ์ดํฐ๋ ์ดํฐ๋ `next()` ๋ฉ์๋๋ฅผ ๊ตฌํํ์ฌ ๊ฐ์ ์ํ์ค๋ฅผ ์ค์ ๋ก ์์ฑํ๋ ๊ฐ์ฒด์ ๋๋ค. `next()`๋ฅผ ํธ์ถํ ๋๋ง๋ค `value`(์ํ์ค์ ๋ค์ ๊ฐ)์ `done`(์ํ์ค๊ฐ ์๋ฃ๋์์ ๋ `true`์ธ ๋ถ๋ฆฌ์ธ)์ด๋ผ๋ ๋ ๊ฐ์ง ์์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๊ฐ ๋ฐํ๋ฉ๋๋ค.
์ด ํ๋กํ ์ฝ์ `for...of` ๋ฃจํ, ์ ๊ฐ ๊ตฌ๋ฌธ, ๊ทธ๋ฆฌ๊ณ ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฌธ์ ๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ง์ ๋ค๋ฃจ๋ ๋ค์ดํฐ๋ธ ๋ฉ์๋๊ฐ ๋ถ์กฑํ๋ค๋ ์ ์ ๋๋ค. ์ด๋ก ์ธํด ๋ ๊ฐ์ง ์ผ๋ฐ์ ์ด์ง๋ง ์ฐจ์ ์ฑ ์ธ ์ฝ๋ฉ ํจํด์ด ์๊ฒจ๋ฌ์ต๋๋ค.
๊ณผ๊ฑฐ์ ๋ฐฉ์: ์ฅํฉํจ ๋ ๋นํจ์จ์ฑ
์ฌ์ฉ์๊ฐ ์ ์ถํ ๋ชจ๋ ํ๊ทธ๊ฐ ๋น์ด ์์ง ์์ ๋ฌธ์์ด์ธ์ง ๊ฒ์ฆํ๋ ์ผ๋ฐ์ ์ธ ์์ ์ ์๊ฐํด ๋ด ์๋ค.
ํจํด 1: ์๋ `for...of` ๋ฃจํ
์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ด์ง๋ง ์ฅํฉํ๊ณ ๋ช ๋ นํ์ ๋๋ค.
function* getTags() {
yield 'JavaScript';
yield 'WebDev';
yield ''; // ์ ํจํ์ง ์์ ํ๊ทธ
yield 'Performance';
}
const tagsIterator = getTags();
let allTagsAreValid = true;
for (const tag of tagsIterator) {
if (typeof tag !== 'string' || tag.length === 0) {
allTagsAreValid = false;
break; // ์๋์ผ๋ก ๋จ๋ฝ ํ๊ฐ๋ฅผ ํด์ผ ํจ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค
}
}
console.log(allTagsAreValid); // false
์ด ์ฝ๋๋ ์๋ฒฝํ๊ฒ ์๋ํ์ง๋ง, ์์ฉ๊ตฌ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค. ํ๋๊ทธ ๋ณ์๋ฅผ ์ด๊ธฐํํ๊ณ , ๋ฃจํ ๊ตฌ์กฐ๋ฅผ ์์ฑํ๊ณ , ์กฐ๊ฑด๋ถ ๋ก์ง์ ๊ตฌํํ๊ณ , ํ๋๊ทธ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ , ๊ฒฐ์ ์ ์ผ๋ก ๋ถํ์ํ ์์ ์ ํผํ๊ธฐ ์ํด ๋ฃจํ๋ฅผ `break`ํ๋ ๊ฒ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค. ์ด๋ ์ธ์ง ๋ถํ๋ฅผ ์ฆ๊ฐ์ํค๋ฉฐ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋งํผ ์ ์ธ์ ์ด์ง ์์ต๋๋ค.
ํจํด 2: ๋นํจ์จ์ ์ธ ๋ฐฐ์ด ๋ณํ
์ด ์ ๊ทผ ๋ฐฉ์์ ์ ์ธ์ ์ด์ง๋ง ์ฑ๋ฅ๊ณผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌ์ํฉ๋๋ค.
const tagsArray = [...getTags()]; // ๋นํจ์จ์ ! ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฒด ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค.
const allTagsAreValid = tagsArray.every(tag => typeof tag === 'string' && tag.length > 0);
console.log(allTagsAreValid); // false
์ด ์ฝ๋๋ ์ฝ๊ธฐ๊ฐ ํจ์ฌ ๊น๋ํ์ง๋ง, ํฐ ๋น์ฉ์ด ๋ฐ๋ฆ ๋๋ค. ์ ๊ฐ ์ฐ์ฐ์ `...`๋ ๋จผ์ ์ ์ฒด ์ดํฐ๋ ์ดํฐ๋ฅผ ์๋ชจํ์ฌ ๋ชจ๋ ์์๋ฅผ ํฌํจํ๋ ์ ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค. ๋ง์ฝ `getTags()`๊ฐ ์๋ฐฑ๋ง ๊ฐ์ ํ๊ทธ๊ฐ ์๋ ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค๋ฉด, ์ด๋ ์์ฒญ๋ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ์ฌ ํ๋ก์ธ์ค๋ฅผ ์ค๋จ์ํฌ ์ ์์ต๋๋ค. ์ด๋ ์ ์ด์ ์ ๋๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ชฉ์ ์ ์์ ํ ๋ฌด์๋ฏธํ๊ฒ ๋ง๋ญ๋๋ค.
์ดํฐ๋ ์ดํฐ ํฌํผ๋ ๋ฐฐ์ด ๋ฉ์๋์ ์ ์ธ์ ์ธ ์คํ์ผ๊ณผ ์ง์ ์ ์ธ ์ดํฐ๋ ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ๊ฒฐํฉํ์ฌ ๋ ์ธ๊ณ์ ์ฅ์ ์ ๋ชจ๋ ์ ๊ณตํจ์ผ๋ก์จ ์ด ๊ฐ๋ฑ์ ํด๊ฒฐํฉ๋๋ค.
๋ฒ์ฉ ๊ฒ์ฆ๊ธฐ: Iterator.prototype.every ์ฌ์ธต ๋ถ์
the `every` ๋ฉ์๋๋ ํฐ๋ฏธ๋ ์ฐ์ฐ์ผ๋ก, ์ดํฐ๋ ์ดํฐ๋ฅผ ์๋นํ์ฌ ๋จ์ผํ ์ต์ข ๊ฐ์ ์์ฑํจ์ ์๋ฏธํฉ๋๋ค. ๊ทธ ๋ชฉ์ ์ ์ดํฐ๋ ์ดํฐ๊ฐ ์์ฑํ ๋ชจ๋ ์์๊ฐ ์ ๊ณต๋ ์ฝ๋ฐฑ ํจ์๋ก ๊ตฌํ๋ ํ ์คํธ๋ฅผ ํต๊ณผํ๋์ง ์ฌ๋ถ๋ฅผ ํ ์คํธํ๋ ๊ฒ์ ๋๋ค.
๊ตฌ๋ฌธ ๋ฐ ๋งค๊ฐ๋ณ์
์ด ๋ฉ์๋์ ์๊ทธ๋์ฒ๋ `Array.prototype.every`๋ฅผ ์ฌ์ฉํด ๋ณธ ๊ฐ๋ฐ์๋ผ๋ฉด ๋๊ตฌ์๊ฒ๋ ์ฆ์ ์น์ํ๊ฒ ๋๊ปด์ง๋๋ก ์ค๊ณ๋์์ต๋๋ค.
iterator.every(callbackFn)
the `callbackFn`๋ ์ฐ์ฐ์ ํต์ฌ์ ๋๋ค. ์กฐ๊ฑด์ด ํด๊ฒฐ๋ ๋๊น์ง ์ดํฐ๋ ์ดํฐ๊ฐ ์์ฑํ๋ ๊ฐ ์์์ ๋ํด ํ ๋ฒ์ฉ ์คํ๋๋ ํจ์์ ๋๋ค. ์ด ํจ์๋ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค:
- `value`: ์ํ์ค์์ ์ฒ๋ฆฌ ์ค์ธ ํ์ฌ ์์์ ๊ฐ์ ๋๋ค.
- `index`: ํ์ฌ ์์์ 0๋ถํฐ ์์ํ๋ ์ธ๋ฑ์ค์ ๋๋ค.
์ฝ๋ฐฑ์ ๋ฐํ ๊ฐ์ด ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๋ง์ฝ "truthy"ํ ๊ฐ( `false`, `0`, `''`, `null`, `undefined`, or `NaN`๊ฐ ์๋ ๋ชจ๋ ๊ฐ)์ ๋ฐํํ๋ฉด, ํด๋น ์์๋ ํ ์คํธ๋ฅผ ํต๊ณผํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ๋ง์ฝ "falsy"ํ ๊ฐ์ ๋ฐํํ๋ฉด, ์์๋ ์คํจํฉ๋๋ค.
๋ฐํ ๊ฐ๊ณผ ๋จ๋ฝ ํ๊ฐ
the `every` ๋ฉ์๋ ์์ฒด๋ ๋จ์ผ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋ฐํํฉ๋๋ค:
- `callbackFn`์ด ์ด๋ค ์์์ ๋ํด falsy ๊ฐ์ ๋ฐํํ๋ ์ฆ์ `false`๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์ค์ํ ๋จ๋ฝ ํ๊ฐ(short-circuiting) ๋์์ ๋๋ค. ์ดํฐ๋ ์ด์ ์ ์ฆ์ ์ค๋จ๋๊ณ , ์์ค ์ดํฐ๋ ์ดํฐ๋ก๋ถํฐ ๋ ์ด์ ์์๋ฅผ ๊ฐ์ ธ์ค์ง ์์ต๋๋ค.
- ์ดํฐ๋ ์ดํฐ๊ฐ ์์ ํ ์๋ชจ๋๊ณ `callbackFn`์ด ๋ชจ๋ ๋จ์ผ ์์์ ๋ํด truthy ๊ฐ์ ๋ฐํํ๋ค๋ฉด `true`๋ฅผ ๋ฐํํฉ๋๋ค.
์ฃ์ง ์ผ์ด์ค์ ๋ฏธ๋ฌํ ์ฐจ์ด์
- ๋น ์ดํฐ๋ ์ดํฐ: ๊ฐ์ ์์ฑํ์ง ์๋ ์ดํฐ๋ ์ดํฐ์ `every`๋ฅผ ํธ์ถํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? `true`๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ๊ฐ๋ ์ ๋ ผ๋ฆฌํ์์ ๊ณตํํ ์ฐธ(vacuous truth)์ผ๋ก ์๋ ค์ ธ ์์ต๋๋ค. "๋ชจ๋ ์์๊ฐ ํ ์คํธ๋ฅผ ํต๊ณผํ๋ค"๋ ์กฐ๊ฑด์ ๊ธฐ์ ์ ์ผ๋ก ์ฐธ์ ๋๋ค. ์๋ํ๋ฉด ํ ์คํธ๋ฅผ ์คํจํ๋ ์์๊ฐ ๋ฐ๊ฒฌ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์ฝ๋ฐฑ์ ๋ถ์ ํจ๊ณผ: ๋จ๋ฝ ํ๊ฐ ๋๋ฌธ์, ์ฝ๋ฐฑ ํจ์๊ฐ ๋ถ์ ํจ๊ณผ(์: ๋ก๊น , ์ธ๋ถ ๋ณ์ ์์ )๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ์ฃผ์ํด์ผ ํฉ๋๋ค. ์ด์ ์์๊ฐ ํ ์คํธ์ ์คํจํ๋ฉด ๋ชจ๋ ์์์ ๋ํด ์ฝ๋ฐฑ์ด ์คํ๋์ง ์์ต๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ์์ค ์ดํฐ๋ ์ดํฐ์ `next()` ๋ฉ์๋๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ฑฐ๋, `callbackFn` ์์ฒด๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ฉด, `every` ๋ฉ์๋๋ ํด๋น ์ค๋ฅ๋ฅผ ์ ํํ๊ณ ์ดํฐ๋ ์ด์ ์ ์ค๋จ๋ฉ๋๋ค.
์ค์ ํ์ฉ: ๊ฐ๋จํ ๊ฒ์ฌ๋ถํฐ ๋ณต์กํ ์คํธ๋ฆผ๊น์ง
๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ๊ฒฌ๋๋ ๋ค์ํ ์๋๋ฆฌ์ค์ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ๋ฐ์ ๊ฑธ์น ๋ค์ฌ๋ค๋ฅํจ์ ๊ฐ์กฐํ๋ ๋ค์ํ ์ค์ ์์ ๋ฅผ ํตํด `Iterator.prototype.every`์ ํ์ ํ๊ตฌํด ๋ด ์๋ค.
์์ 1: DOM ์์ ์ ํจ์ฑ ๊ฒ์ฌ
์น ๊ฐ๋ฐ์๋ค์ `document.querySelectorAll()`์ ์ํด ๋ฐํ๋๋ `NodeList` ๊ฐ์ฒด๋ฅผ ์์ฃผ ๋ค๋ฃน๋๋ค. ํ๋ ๋ธ๋ผ์ฐ์ ์์๋ `NodeList`๊ฐ ์ดํฐ๋ฌ๋ธํ์ง๋ง, ์ง์ ํ `Array`๋ ์๋๋๋ค. `every`๋ ์ด๋ฐ ๊ฒฝ์ฐ์ ์๋ฒฝํฉ๋๋ค.
// HTML:
const formInputs = document.querySelectorAll('form input');
// ๋ฐฐ์ด์ ์์ฑํ์ง ์๊ณ ๋ชจ๋ ํผ ์
๋ ฅ์ ๊ฐ์ด ์๋์ง ํ์ธ
const allFieldsAreFilled = formInputs.values().every(input => input.value.trim() !== '');
if (allFieldsAreFilled) {
console.log('๋ชจ๋ ํ๋๊ฐ ์ฑ์์ก์ต๋๋ค. ์ ์ถ ์ค๋น ์๋ฃ.');
} else {
console.log('๋ชจ๋ ํ์ ํ๋๋ฅผ ์ฑ์์ฃผ์ธ์.');
}
์์ 2: ๊ตญ์ ๋ฐ์ดํฐ ์คํธ๋ฆผ ์ ํจ์ฑ ๊ฒ์ฌ
CSV ํ์ผ์ด๋ API๋ก๋ถํฐ ์ฌ์ฉ์ ๋ฑ๋ก ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ์๋ฒ์ฌ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด ๋ด ์๋ค. ๊ท์ ์ค์๋ฅผ ์ํด, ๋ชจ๋ ์ฌ์ฉ์ ๊ธฐ๋ก์ด ์น์ธ๋ ๊ตญ๊ฐ ์งํฉ์ ์ํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
const ALLOWED_COUNTRY_CODES = new Set(['US', 'CA', 'GB', 'DE', 'AU']);
// ๋๊ท๋ชจ ์ฌ์ฉ์ ๊ธฐ๋ก ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์๋ฎฌ๋ ์ด์
ํ๋ ์ ๋๋ ์ดํฐ
function* userRecordStream() {
yield { userId: 1, country: 'US' };
console.log('์ฌ์ฉ์ 1 ๊ฒ์ฆ๋จ');
yield { userId: 2, country: 'DE' };
console.log('์ฌ์ฉ์ 2 ๊ฒ์ฆ๋จ');
yield { userId: 3, country: 'MX' }; // ๋ฉ์์ฝ๋ ํ์ฉ๋ ์งํฉ์ ์์
console.log('์ฌ์ฉ์ 3 ๊ฒ์ฆ๋จ - ์ด ๋ฉ์์ง๋ ๊ธฐ๋ก๋์ง ์์');
yield { userId: 4, country: 'GB' };
console.log('์ฌ์ฉ์ 4 ๊ฒ์ฆ๋จ - ์ด ๋ฉ์์ง๋ ๊ธฐ๋ก๋์ง ์์');
}
const records = userRecordStream();
const allRecordsAreCompliant = records.every(
record => ALLOWED_COUNTRY_CODES.has(record.country)
);
if (allRecordsAreCompliant) {
console.log('๋ฐ์ดํฐ ์คํธ๋ฆผ์ด ๊ท์ ์ ์ค์ํฉ๋๋ค. ์ผ๊ด ์ฒ๋ฆฌ๋ฅผ ์์ํฉ๋๋ค.');
} else {
console.log('๊ท์ ์ค์ ํ์ธ ์คํจ. ์คํธ๋ฆผ์์ ์ ํจํ์ง ์์ ๊ตญ๊ฐ ์ฝ๋๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค.');
}
์ด ์์ ๋ ๋จ๋ฝ ํ๊ฐ์ ํ์ ์๋ฆ๋ต๊ฒ ๋ณด์ฌ์ค๋๋ค. 'MX'์ ๊ธฐ๋ก์ด ๋ฐ๊ฒฌ๋๋ ์๊ฐ, `every`๋ `false`๋ฅผ ๋ฐํํ๊ณ ์ ๋๋ ์ดํฐ๋ ๋ ์ด์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ๋ฐ์ง ์์ต๋๋ค. ์ด๋ ๋ฐฉ๋ํ ๋ฐ์ดํฐ์ ์ ๊ฒ์ฆํ ๋ ๋งค์ฐ ํจ์จ์ ์ ๋๋ค.
์์ 3: ๋ฌดํ ์ํ์ค ๋ค๋ฃจ๊ธฐ
์ง์ฐ ์ฐ์ฐ์ ์ง์ ํ ์ํ๋๋ ๋ฌดํ ์ํ์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฅ๋ ฅ์ ๋๋ค. `every`๋ ์กฐ๊ฑด์ด ๊ฒฐ๊ตญ ์คํจํ๋ ํ ๋ฌดํ ์ํ์ค์์๋ ์๋ํ ์ ์์ต๋๋ค.
// ๋ฌดํ ์ง์ ์ํ์ค๋ฅผ ์ํ ์ ๋๋ ์ดํฐ
function* infiniteEvenNumbers() {
let n = 0;
while (true) {
yield n;
n += 2;
}
}
// ๋ชจ๋ ์ซ์๊ฐ 100๋ณด๋ค ์์์ง ํ์ธํ ์ ์์ต๋๋ค. ์์ํ ์คํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
// ํ์ง๋ง ๋ชจ๋ ์ซ์๊ฐ ์์๊ฐ ์๋์ง๋ ํ์ธํ ์ ์์ง๋ง, ์ด ๋ํ ์์ํ ์คํ๋ ๊ฒ์
๋๋ค.
// ๋ ์ค์ฉ์ ์ธ ํ์ธ: ์ํ์ค์ ํน์ ์ง์ ๊น์ง ๋ชจ๋ ์ซ์๊ฐ ์ ํจํ๊ฐ?
// `every`๋ฅผ ๋ค๋ฅธ ์ดํฐ๋ ์ดํฐ ํฌํผ์ธ `take`์ ํจ๊ป ์ฌ์ฉํด ๋ด
์๋ค(ํ์ฌ๋ ๊ฐ์์ด์ง๋ง ์ ์์ ์ผ๋ถ์).
// ์์ํ `every` ์์ ๋ฅผ ๊ณ ์ํฉ์๋ค. ์คํจ๊ฐ ๋ณด์ฅ๋ ์กฐ๊ฑด์ ํ์ธํ ์ ์์ต๋๋ค.
const numbers = infiniteEvenNumbers();
// ์ด ํ์ธ์ ๊ฒฐ๊ตญ ์คํจํ๊ณ ์์ ํ๊ฒ ์ข
๋ฃ๋ฉ๋๋ค.
const areAllBelow100 = numbers.every(n => n < 100);
console.log(`๋ชจ๋ ๋ฌดํ ์ง์๊ฐ 100๋ณด๋ค ์์๊ฐ? ${areAllBelow100}`); // false
์ดํฐ๋ ์ด์ ์ 0, 2, 4, ... 98๊น์ง ์งํ๋ฉ๋๋ค. 100์ ๋๋ฌํ๋ฉด `100 < 100` ์กฐ๊ฑด์ ๊ฑฐ์ง์ด ๋ฉ๋๋ค. `every`๋ ์ฆ์ `false`๋ฅผ ๋ฐํํ๊ณ ๋ฌดํ ๋ฃจํ๋ฅผ ์ข ๋ฃํฉ๋๋ค. ์ด๋ ๋ฐฐ์ด ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ผ๋ก๋ ๋ถ๊ฐ๋ฅํ์ ๊ฒ์ ๋๋ค.
Iterator.every ๋ Array.every: ์ ๋ต์ ๊ฒฐ์ ๊ฐ์ด๋
Iterator.prototype.every`์ `Array.prototype.every` ์ฌ์ด์์ ์ ํํ๋ ๊ฒ์ ์ค์ํ ์ํคํ ์ฒ ๊ฒฐ์ ์ ๋๋ค. ์ฌ๋ฌ๋ถ์ ์ ํ์ ๋๊ธฐ ์ํ ๋ถ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ๋จ ๋น๊ต
- ๋ฐ์ดํฐ ์์ค:
- Iterator.every: ๋ชจ๋ ์ดํฐ๋ฌ๋ธ (๋ฐฐ์ด, ๋ฌธ์์ด, ๋งต, ์ , ๋ ธ๋๋ฆฌ์คํธ, ์ ๋๋ ์ดํฐ, ์ปค์คํ ์ดํฐ๋ฌ๋ธ).
- Array.every: ๋ฐฐ์ด๋ง ํด๋น.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ (๊ณต๊ฐ ๋ณต์ก๋):
- Iterator.every: O(1) - ์์. ํ ๋ฒ์ ํ๋์ ์์๋ง ์ ์งํฉ๋๋ค.
- Array.every: O(N) - ์ ํ. ์ ์ฒด ๋ฐฐ์ด์ด ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํด์ผ ํฉ๋๋ค.
- ํ๊ฐ ๋ชจ๋ธ:
- Iterator.every: ์ง์ฐ๋ ํ(Lazy pull). ํ์์ ๋ฐ๋ผ ๊ฐ์ ํ๋์ฉ ์๋นํฉ๋๋ค.
- Array.every: ์ฆ์(Eager). ์์ ํ ๊ตฌ์ฒดํ๋ ์ปฌ๋ ์ ์ ๋ํด ์๋ํฉ๋๋ค.
- ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก:
- Iterator.every: ๋์ฉ๋ ๋ฐ์ดํฐ์ , ๋ฐ์ดํฐ ์คํธ๋ฆผ, ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ํ๊ฒฝ ๋ฐ ๋ชจ๋ ์ผ๋ฐ์ ์ธ ์ดํฐ๋ฌ๋ธ์ ๋ํ ์ฐ์ฐ.
- Array.every: ์ด๋ฏธ ๋ฐฐ์ด ํํ์ธ ์ค์ ๊ท๋ชจ์ ๋ฐ์ดํฐ์ .
๊ฐ๋จํ ์์ฌ ๊ฒฐ์ ํธ๋ฆฌ
์ด๋ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ๋ ค๋ฉด ๋ค์ ์ง๋ฌธ๋ค์ ์ค์ค๋ก์๊ฒ ํด๋ณด์ธ์:
- ๋ด ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ๋ฐฐ์ด์ธ๊ฐ?
- ์: ๋ฐฐ์ด์ด ๋๋ฌด ์ปค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ฌธ์ ๊ฐ ๋ ์ ์๋๊ฐ? ๊ทธ๋ ์ง ์๋ค๋ฉด, `Array.prototype.every`๊ฐ ์๋ฒฝํ๊ฒ ์ข๊ณ ์ข ์ข ๋ ๊ฐ๋จํฉ๋๋ค.
- ์๋์ค: ๋ค์ ์ง๋ฌธ์ผ๋ก ์งํํ์ธ์.
- ๋ด ๋ฐ์ดํฐ ์์ค๊ฐ ๋ฐฐ์ด์ด ์๋ ๋ค๋ฅธ ์ดํฐ๋ฌ๋ธ์ธ๊ฐ (์: Set, ์ ๋๋ ์ดํฐ, ์คํธ๋ฆผ)?
- ์: `Iterator.prototype.every`๊ฐ ์ด์์ ์ธ ์ ํ์ ๋๋ค. `Array.from()`์ ํ๋ํฐ๋ฅผ ํผํ์ธ์.
- ์ด ์์
์์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ด ์ค์ํ ์๊ตฌ์ฌํญ์ธ๊ฐ?
- ์: ๋ฐ์ดํฐ ์์ค์ ์๊ด์์ด `Iterator.prototype.every`๊ฐ ์ฐ์ํ ์ต์ ์ ๋๋ค.
ํ์คํ ๊ณผ์ : ๋ธ๋ผ์ฐ์ ๋ฐ ๋ฐํ์ ์ง์
2023๋ ํ๋ฐ ๊ธฐ์ค์ผ๋ก, ์ดํฐ๋ ์ดํฐ ํฌํผ ์ ์์ TC39 ํ์คํ ๊ณผ์ ์์ 3๋จ๊ณ(Stage 3)์ ์์ต๋๋ค. "ํ๋ณด(Candidate)" ๋จ๊ณ๋ผ๊ณ ๋ ์๋ ค์ง 3๋จ๊ณ๋ ์ ์์ ์ค๊ณ๊ฐ ์๋ฃ๋์์ผ๋ฉฐ ์ด์ ๋ธ๋ผ์ฐ์ ๊ณต๊ธ์ ์ฒด์ ์ํ ๊ตฌํ๊ณผ ๋ ๋์ ๊ฐ๋ฐ ์ปค๋ฎค๋ํฐ์ ํผ๋๋ฐฑ์ ๋ฐ์ ์ค๋น๊ฐ ๋์์์ ์๋ฏธํฉ๋๋ค. ๋ค๊ฐ์ค๋ ECMAScript ํ์ค(์: ES2024 ๋๋ ES2025)์ ํฌํจ๋ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค.
์ค๋๋ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ `Iterator.prototype.every`๋ฅผ ๋ค์ดํฐ๋ธ๋ก ์ฌ์ฉํ ์๋ ์์ง๋ง, ๊ฒฌ๊ณ ํ ์๋ฐ์คํฌ๋ฆฝํธ ์ํ๊ณ๋ฅผ ํตํด ์ฆ์ ๊ทธ ํ์ ํ์ฉํ๊ธฐ ์์ํ ์ ์์ต๋๋ค:
- ํด๋ฆฌํ(Polyfills): ๋ฏธ๋์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ํด๋ฆฌํ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ํด๋ฆฌํ๋ง์ ํ์ค์ธ `core-js` ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ดํฐ๋ ์ดํฐ ํฌํผ ์ ์์ ๋ํ ์ง์์ ํฌํจํฉ๋๋ค. ์ด๋ฅผ ํ๋ก์ ํธ์ ํฌํจํ๋ฉด, ์๋ก์ด ๊ตฌ๋ฌธ์ ๋ค์ดํฐ๋ธ๋ก ์ง์๋๋ ๊ฒ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํธ๋์คํ์ผ๋ฌ(Transpilers): Babel๊ณผ ๊ฐ์ ๋๊ตฌ๋ ํน์ ํ๋ฌ๊ทธ์ธ์ผ๋ก ๊ตฌ์ฑํ์ฌ ์๋ก์ด ์ดํฐ๋ ์ดํฐ ํฌํผ ๊ตฌ๋ฌธ์ ๊ตฌํ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์ ์คํ๋๋ ๋๋ฑํ ํ์ ํธํ ์ฝ๋๋ก ๋ณํํ ์ ์์ต๋๋ค.
์ ์์ ์ํ์ ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ๋ํ ์ต์ ์ ๋ณด๋ GitHub์์ "TC39 Iterator Helpers proposal"์ ๊ฒ์ํ๊ฑฐ๋ MDN Web Docs์ ๊ฐ์ ์น ํธํ์ฑ ์๋ฃ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ฒฐ๋ก : ํจ์จ์ ์ด๊ณ ํํ๋ ฅ ์๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์๋ก์ด ์๋
Iterator.prototype.every` ๋ฐ ๋ ๋์ ๋ฒ์์ ์ดํฐ๋ ์ดํฐ ํฌํผ์ ์ถ๊ฐ๋ ๋จ์ํ ๊ตฌ๋ฌธ์ ํธ์์ฑ ์ด์์ ๋๋ค; ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ๊ทผ๋ณธ์ ์ผ๋ก ํฅ์์ํค๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ธ์ด์ ์ค๋ ๊ฒฉ์ฐจ๋ฅผ ํด์ํ์ฌ, ๊ฐ๋ฐ์๋ค์ด ๋ ํํ๋ ฅ ์๊ณ , ๋ ์ฑ๋ฅ์ด ์ข์ผ๋ฉฐ, ๊ทน์ ์ผ๋ก ๋ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ํ์ ์ค์ด์ค๋๋ค.
๋ชจ๋ ์ดํฐ๋ฌ๋ธ ์ํ์ค์ ๋ํด ๋ฒ์ฉ ์กฐ๊ฑด ๊ฒ์ฌ๋ฅผ ์ํํ๋ ์ผ๊ธ์ ์ ์ธ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํจ์ผ๋ก์จ, `every`๋ ์ํฌ๋ฅธ ์๋ ๋ฃจํ๋ ๋ญ๋น์ ์ธ ์ค๊ฐ ๋ฐฐ์ด ํ ๋น์ ํ์์ฑ์ ์ ๊ฑฐํฉ๋๋ค. ์ด๋ ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ถํฐ ์๋ฒ์์ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ฒ๋ฆฌ์ ์ด๋ฅด๊ธฐ๊น์ง ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๋์ ์ ์ ๋ง๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ์ด์งํฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ด ๋ชจ๋ ๊ธ๋ก๋ฒ ํ๊ฒฝ์์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ค์ ๋ค์ดํฐ๋ธ ๋ถ๋ถ์ด ๋จ์ ๋ฐ๋ผ, ์์ฌํ ์ฌ์ง ์์ด ํ์์ ์ธ ๋๊ตฌ๊ฐ ๋ ๊ฒ์ ๋๋ค. ์ค๋๋ถํฐ ํด๋ฆฌํ์ ํตํด ์คํํด ๋ณด์๊ธฐ๋ฅผ ๊ถ์ฅํฉ๋๋ค. ์ฝ๋๋ฒ ์ด์ค์์ ๋ถํ์ํ๊ฒ ์ดํฐ๋ฌ๋ธ์ ๋ฐฐ์ด๋ก ๋ณํํ๋ ๋ถ๋ถ์ ์๋ณํ๊ณ , ์ด ์๋ก์ด ๋ฉ์๋๊ฐ ์ด๋ป๊ฒ ์ฌ๋ฌ๋ถ์ ๋ก์ง์ ๋จ์ํํ๊ณ ์ต์ ํํ ์ ์๋์ง ํ์ธํด ๋ณด์ธ์. ๋ ๊นจ๋ํ๊ณ , ๋ ๋น ๋ฅด๋ฉฐ, ๋ ํ์ฅ ๊ฐ๋ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ์ดํฐ๋ ์ด์ ์ ๋ฏธ๋์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค.